package oen.game.assist.kit.util;

import im.oen.boot.common.utils.Runner;

import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;

/**
 * <p>描述：键鼠操作类</p>
 *
 * <p>创建时间：2021-12-15 17:10</p>
 * <p>更新时间：暂无</p>
 *
 * @author Kevin.Xu
 * @version 1.0
 */
public class RobotUtil {

    private static Robot robot;

    private static Robot getRobot() {
        if (robot == null) {
            robot = Runner.safeRun(() -> new Robot());
        }
        return robot;
    }

    private static void mouseClick(int button) {
        getRobot().mousePress(button);
        getRobot().delay(25);
        getRobot().mouseRelease(button);
        getRobot().delay(15);
    }

    private static void keyClick(int key) {
        getRobot().keyPress(key);
        getRobot().delay(33);
        getRobot().keyRelease(key);
        getRobot().delay(20);
    }

    private static void comboKeyClick(int... keys) {
        for (int key : keys) {
            getRobot().keyPress(key);
            getRobot().delay(16);
        }
        getRobot().delay(20);
        for (int key : keys) {
            getRobot().keyRelease(key);
            getRobot().delay(16);
        }
        getRobot().delay(18);
    }

    /**
     * 把鼠标移动到指定的x,y位置
     *
     * @param x 屏幕坐标 X
     * @param y 屏幕坐标 Y
     */
    public static void moveTo(int x, int y) {
        getRobot().mouseMove(x, y);
    }


    /**
     * 单击鼠标左键
     */
    public static void mouseLeftClick() {
        mouseClick(InputEvent.BUTTON1_DOWN_MASK);
    }

    /**
     * 单击鼠标滚轮
     */
    public static void mouseWheelClick() {
        mouseClick(InputEvent.BUTTON2_DOWN_MASK);
    }

    /**
     * 单击鼠标右键
     */
    public static void mouseRightClick() {
        mouseClick(InputEvent.BUTTON3_DOWN_MASK);
    }

    /**
     * 滚动鼠标滚轮
     *
     * @param amount 滚轮滚动刻度值：负值表示向上/远离用户移动，正值表示向下/朝向用户移动 (具体看操作系统的设置)
     */
    public static void mouseWheel(int amount) {
        getRobot().mouseWheel(amount);
    }

    /**
     * 按回车
     */
    public static void enterClick() {
        keyClick(KeyEvent.VK_ENTER);
    }

    /**
     * 键盘单独按键
     *
     * @param key KeyEvent.VK_Y
     */
    public static void keyPress(int key) {
        keyClick(key);
    }

    /**
     * 组合按键
     *
     * @param key1 KeyEvent.VK_CONTROL
     * @param key2 KeyEvent.VK_V
     */
    public static void keyCombo(int key1, int key2) {
        comboKeyClick(key1, key2);
    }

    /**
     * 组合按键
     *
     * @param key1 KeyEvent.VK_CONTROL
     * @param key2 KeyEvent.VK_SHIFT
     * @param key3 KeyEvent.VK_X
     */
    public static void keyCombo(int key1, int key2, int key3) {
        comboKeyClick(key1, key2, key3);
    }

    /**
     * 长按某键多少秒
     *
     * @param key    KeyEvent.VK_X
     * @param second 按键时长
     */
    public static void longKeyPress(int key, int second) {
        getRobot().keyPress(key);
        getRobot().delay(second * 1000 + 20);
        getRobot().keyRelease(key);
        getRobot().delay(18);
    }

    /**
     * 获取指定位置的颜色信息
     *
     * @param x 屏幕坐标 X
     * @param y 屏幕坐标 Y
     * @return 颜色信息
     */
    public static Color pixelColor(int x, int y) {
        return getRobot().getPixelColor(x, y);
    }

    /**
     * 在指定位置截图
     *
     * @param x 屏幕坐标 X
     * @param y 屏幕坐标 Y
     * @param w 截图宽度
     * @param h 截图高度
     * @return 截图信息
     */
    public static BufferedImage screenCapture(int x, int y, int w, int h) {
        return getRobot().createScreenCapture(new Rectangle(x, y, w, h));
    }

    /**
     * 从0，0开始截图
     *
     * @param w 截图宽度
     * @param h 截图高度
     * @return 截图信息
     */
    public static BufferedImage screenCapture(int w, int h) {
        return getRobot().createScreenCapture(new Rectangle(0, 0, w, h));
    }

    /**
     * 截取全屏
     *
     * @return 截取的图片信息
     */
    public static BufferedImage screenCapture() {
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        return screenCapture(screenSize.width, screenSize.height);
    }
}
